   #pragma once
#include "google/protobuf/service.h"
// 框架提供的专门服务发布rpc的网络对象类
#include <google/protobuf/descriptor.h>
#include <memory>
#include <muduo/net/Callbacks.h>
#include <muduo/net/TcpConnection.h>
#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/InetAddress.h>
#include <unordered_map>
#include <string>

class RpcProvider
{
public:
    // 这里是框架提供的外部进行注册
    // void NotifyServise(UserService* service) 不能依赖于某个具体业务!
    void NotifyService(google::protobuf::Service * service);

    // 启动网络调用函数
    void Run();
    // 启动rpc服务节点，开始提供rpc远程网络调用服务,需要回调函数
    void OnConnection(const muduo::net::TcpConnectionPtr &conn);
    void OnMessage(const muduo::net::TcpConnectionPtr &conn,
                   muduo::net::Buffer *buffer,
                   muduo::Timestamp time);
    // Closure的回调函数，用于序列化rpc的响应和网络发送
    void SendRpcResponse(const muduo::net::TcpConnectionPtr  &conn, google::protobuf::Message *response);
private: 
    struct ServiceInfo{
        google::protobuf::Service *_service_ptr;//服务对象指针
        std::unordered_map<std::string,const google::protobuf::MethodDescriptor*> _method_dic;
    };
    std::unordered_map<std::string, ServiceInfo> _service_dic;
    // muduo::net::TcpServer *_server; //tcpserver对象指针
    // std::unordered_map<std::string, ServiceInfo> ServiceInfo;

    muduo::net::EventLoop _eventLoop;
};
